﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

#Область БлокировкаСеансовИЗаданий

// Возвращает текущее состояние блокировки сеансов и регламентных заданий для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение: 
//   см. АдминистрированиеКластера.СвойстваБлокировкиСеансовИРегламентныхЗаданий
//
Функция БлокировкаСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Результат = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(
		ИБ.ИнформационнаяБаза,
		СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий());
	
	Если Результат.ДатаС = АдминистрированиеКластера.ПустаяДата() Тогда
		Результат.ДатаС = Неопределено;
	КонецЕсли;
	
	Если Результат.ДатаПо = АдминистрированиеКластера.ПустаяДата() Тогда
		Результат.ДатаПо = Неопределено;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.КодРазрешения) Тогда
		Результат.КодРазрешения = "";
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.Сообщение) Тогда
		Результат.Сообщение = "";
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат.ПараметрБлокировки) Тогда
		Результат.ПараметрБлокировки = "";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Устанавливает новое состояние блокировки сеансов и регламентных заданий для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   СвойстваБлокировкиСеансовИЗаданий - см. АдминистрированиеКластера.СвойстваБлокировкиСеансовИРегламентныхЗаданий
//
Процедура УстановитьБлокировкуСеансовИЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач СвойстваБлокировкиСеансовИЗаданий) Экспорт
	
	УстанавливаемаяБлокировка = Новый Структура();
	Для Каждого КлючИЗначение Из СвойстваБлокировкиСеансовИЗаданий Цикл
		УстанавливаемаяБлокировка.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
	КонецЦикла;
	
	Если Не ЗначениеЗаполнено(УстанавливаемаяБлокировка.ДатаС) Тогда
		УстанавливаемаяБлокировка.ДатаС = АдминистрированиеКластера.ПустаяДата();
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(УстанавливаемаяБлокировка.ДатаПо) Тогда
		УстанавливаемаяБлокировка.ДатаПо = АдминистрированиеКластера.ПустаяДата();
	КонецЕсли;
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(ИБ.ИнформационнаяБаза,
		УстанавливаемаяБлокировка,
		СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий());
	
	ИБ.СоединениеСРабочимПроцессом.UpdateInfoBase(ИБ.ИнформационнаяБаза);
	
КонецПроцедуры

// Проверяет корректность параметров администрирования.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   ПроверятьПараметрыАдминистрированияКластера - Булево - флаг необходимости проверки параметров администрирования 
//                  кластера.
//  ПроверятьПараметрыАдминистрированияИнформационнойБазы - Булево - флаг необходимости проверки параметров
//                  администрирования кластера.
//
Процедура ПроверитьПараметрыАдминистрирования(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено,
	ПроверятьПараметрыАдминистрированияИнформационнойБазы = Истина,
	ПроверятьПараметрыАдминистрированияКластера = Истина) Экспорт
	
	Если ПроверятьПараметрыАдминистрированияКластера Или ПроверятьПараметрыАдминистрированияИнформационнойБазы Тогда
		
		ПопыткаСоединения = 1;
		Пока ПопыткаСоединения <= 2 Цикл
			Попытка
				COMСоединитель = COMСоединитель();
				
				СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
					ПараметрыАдминистрированияКластера.АдресАгентаСервера,
					ПараметрыАдминистрированияКластера.ПортАгентаСервера);
				
				Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
					ПараметрыАдминистрированияКластера.ПортКластера,
					ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
					ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);

				ПопыткаСоединения = ПопыткаСоединения + 1;
			Исключение
				ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось подключиться с компьютера %1 к кластеру серверов по причине:
						|%2.'"),
					ИмяКомпьютера(), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
				Если ОбщегоНазначения.ЭтоWindowsСервер() Тогда 
					Если ПопыткаСоединения = 1 Тогда
						Если ЗарегистрироватьCOMСоединитель(ТекстИсключения + Символы.ПС + Символы.ПС) Тогда
							ПопыткаСоединения = ПопыткаСоединения + 1;
							Продолжить;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				ТекстИсключения = ТекстИсключения + Символы.ПС + Символы.ПС + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Если в сообщении указано, что ""класс не зарегистрирован"" или не совпадает версия компоненты ""comcntr"" с требуемой,
						|то следует зарегистрировать ее на компьютере %1, для этого обратитесь к администратору.
						|Для этого под учетной записью ОС Windows, от имени которой запущен сервер 1С:Предприятие, выполнить команду:
						|regsvr32.exe comcntr.dll'"),
					ИмяКомпьютера());
				ВызватьИсключение ТекстИсключения
				
			КонецПопытки;
		КонецЦикла;
		
	КонецЕсли;
	
	Если ПроверятьПараметрыАдминистрированияИнформационнойБазы Тогда
		
		СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
		
		ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
			ПараметрыАдминистрированияИБ.ИмяВКластере,
			ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
			ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область БлокировкаРегламентныхЗаданий

// Возвращает текущее состояние блокировки регламентных заданий для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение: 
//   Булево - состояние блокировки.
//
Функция БлокировкаРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Возврат ИБ.ИнформационнаяБаза.ScheduledJobsDenied;
	
КонецФункции

// Устанавливает новое состояние блокировки регламентных заданий для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   БлокировкаРегламентныхЗаданий - Булево - флаг установки блокировки регламентных заданий информационной базы.
//
Процедура УстановитьБлокировкуРегламентныхЗаданийИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач БлокировкаРегламентныхЗаданий) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИБ.ИнформационнаяБаза.ScheduledJobsDenied = БлокировкаРегламентныхЗаданий;
	ИБ.СоединениеСРабочимПроцессом.UpdateInfoBase(ИБ.ИнформационнаяБаза);
	
КонецПроцедуры

#КонецОбласти

#Область СеансыИнформационнойБазы

// Возвращает описания сеансов информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСеансов
//          - Массив из см. АдминистрированиеКластера.ФильтрСеансов
//
// Возвращаемое значение: 
//   Массив из см. АдминистрированиеКластера.СвойстваСеанса
//
Функция СеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ОписаниеИнформационнойБазы = ПолучитьОписаниеИБ(
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере);
	
	Возврат ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Истина);
	
КонецФункции

// Удаляет сеансы с информационной базой по фильтру.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСеансов
//          - Массив из см. АдминистрированиеКластера.ФильтрСеансов
//
Процедура УдалитьСеансыИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ОписаниеИнформационнойБазы = ПолучитьОписаниеИБ(
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере);
	
	КоличествоПопыток = 3;
	ВсеСеансыУдалены = Ложь;
	
	Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
		
		Сеансы = ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ОписаниеИнформационнойБазы, Фильтр, Ложь);
		
		Если Сеансы.Количество() = 0 Тогда
			
			ВсеСеансыУдалены = Истина;
			Прервать;
			
		ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
			
			Прервать;
			
		КонецЕсли;
		
		Для каждого Сеанс Из Сеансы Цикл
			
			Попытка
				
				СоединениеСАгентомСервера.TerminateSession(Кластер, Сеанс);
				
			Исключение
				
				// Сеанс мог завершиться к моменту вызова TerminateSession.
				Продолжить;
				
			КонецПопытки;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Если НЕ ВсеСеансыУдалены Тогда
	
		ВызватьИсключение НСтр("ru = 'Не удалось удалить сеансы.'");
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СоединенияСИнформационнойБазой

// Возвращает описания соединений с информационной базой.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСоединений
//          - Массив из см. АдминистрированиеКластера.ФильтрСоединений
//
// Возвращаемое значение: 
//   Массив из см. АдминистрированиеКластера.СвойстваСоединения
//
Функция СоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, 
	Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	Возврат ПолучитьСоединения(
		COMСоединитель,
		СоединениеСАгентомСервера,
		Кластер,
		ПараметрыАдминистрированияИБ,
		Фильтр,
		Истина);
	
КонецФункции

// Разрывает соединения с информационной базой по фильтру.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   Фильтр - см. АдминистрированиеКластера.ФильтрСоединений
//          - Массив из см. АдминистрированиеКластера.ФильтрСоединений
//
Процедура РазорватьСоединенияСИнформационнойБазой(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, 
	Знач Фильтр = Неопределено) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
		
	Значение = Новый Массив;
	Значение.Добавить("1CV8");               // идентификатор приложения 1С:Предприятие в режиме запуска "Толстый клиент".
	Значение.Добавить("1CV8C");              // идентификатор приложения 1С:Предприятие в режиме запуска "Тонкий клиент".
	Значение.Добавить("WebClient");          // идентификатор приложения 1С:Предприятие в режиме запуска "Веб-клиент".
	Значение.Добавить("Designer");           // идентификатор приложения Конфигуратор.
	Значение.Добавить("COMConnection");      // идентификатор сессии внешнего соединения 1С:Предприятия через COM.
	Значение.Добавить("WSConnection");       // идентификатор сессии Web-сервиса.
	Значение.Добавить("BackgroundJob");      // идентификатор сессии обработки заданий.
	Значение.Добавить("WebServerExtension"); // идентификатор расширения Web-сервера.

	АдминистрированиеКластера.ДобавитьУсловиеФильтра(Фильтр, "ИдентификаторКлиентскогоПриложения", ВидСравнения.ВСписке, Значение);
		
	КоличествоПопыток = 3;
	ВсеСоединенияРазорваны = Ложь;
	
	Для ТекущаяПопытка = 0 По КоличествоПопыток Цикл
		
		Соединения = ПолучитьСоединения(
			COMСоединитель,
			СоединениеСАгентомСервера,
			Кластер,
			ПараметрыАдминистрированияИБ,
			Фильтр,
			Ложь);
	
		Если Соединения.Количество() = 0 Тогда
			
			ВсеСоединенияРазорваны = Истина;
			Прервать;
			
		ИначеЕсли ТекущаяПопытка = КоличествоПопыток Тогда
			
			Прервать;
			
		КонецЕсли;
	
		Для каждого Соединение Из Соединения Цикл
			
			Попытка
				
				Соединение.СоединениеСРабочимПроцессом.Disconnect(Соединение.Соединение);
				
			Исключение
				
				// Соединение могло уже завершиться к моменту вызова Disconnect.
				Продолжить;
				
			КонецПопытки;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Если НЕ ВсеСоединенияРазорваны Тогда
	
		ВызватьИсключение НСтр("ru = 'Не удалось разорвать соединения.'");
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПрофилиБезопасности

// Возвращает имя профиля безопасности, назначенного для информационной базы.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение: 
//   Строка - имя профиля безопасности, назначенного для информационной базы. Если для информационной базы не назначен
//                  профиль безопасности - возвращается пустая строка.
//
Функция ПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Если ЗначениеЗаполнено(ИБ.ИнформационнаяБаза.SecurityProfileName) Тогда
		Результат = ИБ.ИнформационнаяБаза.SecurityProfileName;
	Иначе
		Результат = "";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Возвращает имя профиля безопасности, назначенного для информационной базы в качестве профиля безопасности
//  безопасного режима.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//
// Возвращаемое значение: 
//   Строка - имя профиля безопасности, назначенного для информационной базы в качестве профиля безопасности безопасного
//                  режима. Если для информационной базы не назначен профиль безопасности, возвращается пустая строка.
//
Функция ПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	Если ЗначениеЗаполнено(ИБ.ИнформационнаяБаза.SafeModeSecurityProfileName) Тогда
		Результат = ИБ.ИнформационнаяБаза.SafeModeSecurityProfileName;
	Иначе
		Результат = "";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Назначает для информационной базы использование профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет 
//                  отключено использование профиля безопасности.
//
Процедура УстановитьПрофильБезопасностиИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач ИмяПрофиля = "") Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИБ.ИнформационнаяБаза.SecurityProfileName = ИмяПрофиля;
	ИБ.СоединениеСРабочимПроцессом.UpdateInfoBase(ИБ.ИнформационнаяБаза);
	
КонецПроцедуры

// Назначает для информационной базы использование профиля безопасности безопасного режима.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ПараметрыАдминистрированияИБ - см. АдминистрированиеКластера.ПараметрыАдминистрированияИнформационнойБазыКластера
//   ИмяПрофиля - Строка - имя профиля безопасности. Если передана пустая строка - для информационной базы будет 
//                  отключено использование профиля безопасности безопасного режима.
//
Процедура УстановитьПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ, Знач ИмяПрофиля = "") Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	СоединенияСРабочимиПроцессами = СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер);
	
	ИБ = ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер,
		ПараметрыАдминистрированияИБ.ИмяВКластере,
		ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы,
		ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы);
	
	ИБ.ИнформационнаяБаза.SafeModeSecurityProfileName = ИмяПрофиля;
	ИБ.СоединениеСРабочимПроцессом.UpdateInfoBase(ИБ.ИнформационнаяБаза);
	
КонецПроцедуры

// Проверяет существование в кластере серверов профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ИмяПрофиля - Строка - имя профиля безопасности, существование которого проверяется.
//
// Возвращаемое значение:
//   Булево
//
Функция ПрофильБезопасностиСуществует(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	Для Каждого ПрофильБезопасности Из СоединениеСАгентомСервера.GetSecurityProfiles(Кластер) Цикл
		
		Если ПрофильБезопасности.Name = ИмяПрофиля Тогда
			Возврат Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

// Возвращает свойства профиля безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ИмяПрофиля - Строка - имя профиля безопасности.
//
// Возвращаемое значение: 
//   см. АдминистрированиеКластера.СвойстваПрофиляБезопасности
//
Функция ПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = ПолучитьПрофильБезопасности(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	
	Результат = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(
		ПрофильБезопасности,
		СловарьСвойствПрофиляБезопасности());
	
	// Виртуальный каталоги
	Результат.Вставить("ВиртуальныеКаталоги",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВиртуальногоКаталога()));
	
	// Разрешенные COM-классы
	Результат.Вставить("COMКлассы",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствCOMКласса()));
	
	// Внешние компоненты
	Результат.Вставить("ВнешниеКомпоненты",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВнешнейКомпоненты()));
	
	// Внешние модули
	Результат.Вставить("ВнешниеМодули",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствВнешнегоМодуля()));
	
	// Приложения ОС
	Результат.Вставить("ПриложенияОС",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствПриложенияОС()));
	
	// Интернет-ресурсы
	Результат.Вставить("ИнтернетРесурсы",
		ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(
			ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля),
			СловарьСвойствИнтернетРесурса()));
	
	Возврат Результат;
	
КонецФункции

// Создает профиль безопасности по переданному описанию.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   СвойстваПрофиляБезопасности - см. АдминистрированиеКластера.СвойстваПрофиляБезопасности
//
Процедура СоздатьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = СоединениеСАгентомСервера.CreateSecurityProfile();
	ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности);
	
КонецПроцедуры

// Устанавливает свойства для существующего профиля безопасности по переданному описанию.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   СвойстваПрофиляБезопасности - см. АдминистрированиеКластера.СвойстваПрофиляБезопасности
//
Процедура УстановитьСвойстваПрофиляБезопасности(Знач ПараметрыАдминистрированияКластера, Знач СвойстваПрофиляБезопасности)  Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПрофильБезопасности = ПолучитьПрофильБезопасности(
		СоединениеСАгентомСервера,
		Кластер,
		СвойстваПрофиляБезопасности.Имя);
	
	ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности);
	
КонецПроцедуры

// Удаляет профиль безопасности.
//
// Параметры:
//   ПараметрыАдминистрированияКластера - см. АдминистрированиеКластера.ПараметрыАдминистрированияКластера
//   ИмяПрофиля - Строка - имя профиля безопасности.
//
Процедура УдалитьПрофильБезопасности(Знач ПараметрыАдминистрированияКластера, Знач ИмяПрофиля) Экспорт
	
	COMСоединитель = COMСоединитель();
	
	СоединениеСАгентомСервера = СоединениеСАгентомСервера(
		COMСоединитель,
		ПараметрыАдминистрированияКластера.АдресАгентаСервера,
		ПараметрыАдминистрированияКластера.ПортАгентаСервера);
	
	Кластер = ПолучитьКластер(
		СоединениеСАгентомСервера,
		ПараметрыАдминистрированияКластера.ПортКластера,
		ПараметрыАдминистрированияКластера.ИмяАдминистратораКластера,
		ПараметрыАдминистрированияКластера.ПарольАдминистратораКластера);
	
	ПолучитьПрофильБезопасности(
		СоединениеСАгентомСервера,
		Кластер,
		ИмяПрофиля);
	
	СоединениеСАгентомСервера.UnregSecurityProfile(Кластер, ИмяПрофиля);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция COMСоединитель()
	
	Если БезопасныйРежим() <> Ложь Тогда
		ВызватьИсключение НСтр("ru = 'Администрирование кластера невозможно в безопасном режиме'");
	КонецЕсли;
	
	Если ОбщегоНазначения.РазделениеВключено() Тогда
		ВызватьИсключение НСтр("ru = 'В модели сервиса недопустимо выполнение прикладной информационной базой функций администрирования кластера'");
	КонецЕсли;
	
	Возврат Новый COMОбъект(ОбщегоНазначенияКлиентСервер.ИмяCOMСоединителя());
	
КонецФункции

Функция ЗарегистрироватьCOMСоединитель(Знач Сообщение = "")
	ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
	ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
	ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина;
	ТекстКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		"regsvr32.exe /n /i:user /s ""%1\comcntr.dll""", КаталогПрограммы());
	РезультатЗапуска = ФайловаяСистема.ЗапуститьПрограмму(ТекстКоманды, ПараметрыЗапускаПрограммы);
	
	Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '%1Выполнена перерегистрация компоненты ""comcntr"" на компьютере %2.
			|Команда: %3
			|Код возврата %4, сообщение:
			|%5'"), 
		Сообщение, ИмяКомпьютера(), ТекстКоманды, РезультатЗапуска.КодВозврата, РезультатЗапуска.ПотокВывода);
	ЗаписьЖурналаРегистрации(НСтр("ru = 'Подключение к кластеру серверов'", ОбщегоНазначения.КодОсновногоЯзыка()),
		?(РезультатЗапуска.КодВозврата = 0, УровеньЖурналаРегистрации.Информация, УровеньЖурналаРегистрации.Предупреждение),,, 
		Комментарий);
	Возврат РезультатЗапуска.КодВозврата = 0;
КонецФункции

Функция СоединениеСАгентомСервера(COMСоединитель, Знач АдресАгентаСервера, Знач ПортАгентаСервера)
	
	СтрокаСоединенияСАгентомСервера = "tcp://" + АдресАгентаСервера + ":" + Формат(ПортАгентаСервера, "ЧГ=0");
	СоединениеСАгентомСервера = COMСоединитель.ConnectAgent(СтрокаСоединенияСАгентомСервера);
	Возврат СоединениеСАгентомСервера;
	
КонецФункции

Функция ПолучитьКластер(СоединениеСАгентомСервера, Знач ПортКластера, Знач ИмяАдминистратораКластера, Знач ПарольАдминистратораКластера)
	
	Для Каждого Кластер Из СоединениеСАгентомСервера.GetClusters() Цикл
		Если Кластер.MainPort = ПортКластера Тогда
			СоединениеСАгентомСервера.Authenticate(Кластер, ИмяАдминистратораКластера, ПарольАдминистратораКластера);
			Возврат Кластер;
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'На рабочем сервере %1 не существует кластер %2'"),
		СоединениеСАгентомСервера.ConnectionString,
		ПортКластера);
	
КонецФункции

Функция СоединенияСРабочимиПроцессами(COMСоединитель, СоединениеСАгентомСервера, Кластер)
	
	Результат = Новый Массив;
	
	Для Каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
		Если РабочийПроцесс.Running И РабочийПроцесс.IsEnable  Тогда
			СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
			Результат.Добавить(COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом));
		КонецЕсли;
	КонецЦикла;
	
	Если Результат.Количество() = 0 Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует активных рабочих процессов.'"),
			Кластер.HostName,
			Формат(Кластер.MainPort, "ЧГ=0"));
	КонецЕсли;
	Возврат Результат;	
		
КонецФункции

Функция ПолучитьОписаниеИБ(СоединениеСАгентомСервера, Кластер, Знач ИмяВКластере)
	
	Для Каждого ОписаниеИнформационнойБазы Из СоединениеСАгентомСервера.GetInfoBases(Кластер) Цикл
		Если НРег(ОписаниеИнформационнойБазы.Name) = НРег(ИмяВКластере) Тогда
			Возврат ОписаниеИнформационнойБазы;
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует информационная база ""%3""'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяВКластере);
	
КонецФункции

Функция ПолучитьИБ(СоединенияСРабочимиПроцессами, Кластер, Знач ИмяВКластере, Знач ИмяАдминистратораИБ, Знач ПарольАдминистратораИБ)
	
	ИнформационнаяБазаНайдена = Ложь;

	Для Каждого СоединениеСРабочимПроцессом Из СоединенияСРабочимиПроцессами Цикл
		СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
	
		Для Каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
			
			Если НРег(ИнформационнаяБаза.Name) <> НРег(ИмяВКластере) Тогда
				Продолжить;
			КонецЕсли;
			
			ИнформационнаяБазаНайдена = Истина;
			Если Не ЗначениеЗаполнено(ИнформационнаяБаза.DBMS) Тогда
				Продолжить;
			КонецЕсли;
			
			Результат = Новый Структура("ИнформационнаяБаза, СоединениеСРабочимПроцессом");
			Результат.ИнформационнаяБаза = ИнформационнаяБаза;
			Результат.СоединениеСРабочимПроцессом = СоединениеСРабочимПроцессом;
			Возврат Результат;
			
		КонецЦикла;
	КонецЦикла;
	
	Если ИнформационнаяБазаНайдена Тогда	
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неправильные имя и пароль администратора информационной базы %1 в кластере серверов %2:%3 (имя: ""%4"").'"),
			ИмяВКластере, Кластер.HostName, Кластер.MainPort, ИмяАдминистратораИБ);
	Иначе		
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'В кластере серверов %1:%2 не существует информационная база ""%3""'"),
			Кластер.HostName, Формат(Кластер.MainPort, "ЧГ=0"), ИмяВКластере);
	КонецЕсли;
		
КонецФункции

Функция ПолучитьСеансы(СоединениеСАгентомСервера, Кластер, ИнформационнаяБаза, Знач Фильтр = Неопределено, Знач Описания = Ложь)
	
	Сеансы = Новый Массив;
	
	Словарь = СловарьСвойствСеансов();
	БлокировкиСеансов = Новый Соответствие();
	
	Для Каждого Блокировка Из СоединениеСАгентомСервера.GetInfoBaseLocks(Кластер, ИнформационнаяБаза) Цикл
		
		Если Блокировка.Session <> Неопределено Тогда
			
			АдминистрированиеКластера.ДанныеСеансаИзБлокировки(
				БлокировкиСеансов,
				Блокировка.LockDescr,
				Блокировка.Session.SessionID,
				ИнформационнаяБаза.Name);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Для Каждого Сеанс Из СоединениеСАгентомСервера.GetInfoBaseSessions(Кластер, ИнформационнаяБаза) Цикл
		
		ОписаниеСеанса = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Сеанс, Словарь);
		ОписаниеСеанса.Вставить("РежимБлокировкиБД",
			?(БлокировкиСеансов[ОписаниеСеанса.Номер] <> Неопределено, БлокировкиСеансов[ОписаниеСеанса.Номер].РежимБлокировкиБД, ""));
		ОписаниеСеанса.Вставить("Разделитель",
			?(БлокировкиСеансов[ОписаниеСеанса.Номер] <> Неопределено, БлокировкиСеансов[ОписаниеСеанса.Номер].Разделитель, ""));
		
		Если АдминистрированиеКластера.ПроверитьУсловияФильтра(ОписаниеСеанса, Фильтр) Тогда
			
			Если Описания Тогда
				Сеансы.Добавить(ОписаниеСеанса);
			Иначе
				Сеансы.Добавить(Сеанс);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Сеансы;
	
КонецФункции

Функция ПолучитьСоединения(COMСоединитель, СоединениеСАгентомСервера, Кластер, ПараметрыАдминистрированияИБ, Знач Фильтр = Неопределено, Знач Описания = Ложь)
	
	ИмяВКластере = ПараметрыАдминистрированияИБ.ИмяВКластере;
	ИмяАдминистратораИБ = ПараметрыАдминистрированияИБ.ИмяАдминистратораИнформационнойБазы;
	ПарольАдминистратораИБ = ПараметрыАдминистрированияИБ.ПарольАдминистратораИнформационнойБазы;
	
	Соединения = Новый Массив();
	Словарь = СловарьСвойствСоединений();
	
	Для каждого РабочийПроцесс Из СоединениеСАгентомСервера.GetWorkingProcesses(Кластер) Цикл
		
		Если РабочийПроцесс.Running = 0 Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаСоединенияСРабочимПроцессом = РабочийПроцесс.HostName + ":" + Формат(РабочийПроцесс.MainPort, "ЧГ=");
		СоединениеСРабочимПроцессом = COMСоединитель.ConnectWorkingProcess(СтрокаСоединенияСРабочимПроцессом);
		
		Для каждого ИнформационнаяБаза Из СоединениеСРабочимПроцессом.GetInfoBases() Цикл
			
			Если НРег(ИнформационнаяБаза.Name) = НРег(ИмяВКластере) Тогда
				
				СоединениеСРабочимПроцессом.AddAuthentication(ИмяАдминистратораИБ, ПарольАдминистратораИБ);
				Для каждого Соединение Из СоединениеСРабочимПроцессом.GetInfoBaseConnections(ИнформационнаяБаза) Цикл
					
					ОписаниеСоединения = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Соединение, Словарь);
					Если АдминистрированиеКластера.ПроверитьУсловияФильтра(ОписаниеСоединения, Фильтр) Тогда
						Если Описания Тогда
							Соединения.Добавить(ОписаниеСоединения);
						Иначе
							Соединения.Добавить(Новый Структура("СоединениеСРабочимПроцессом, Соединение", СоединениеСРабочимПроцессом, Соединение));
						КонецЕсли;
					КонецЕсли;
				
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Соединения;
	
КонецФункции

Функция ПолучитьПрофильБезопасности(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	Для Каждого ПрофильБезопасности Из СоединениеСАгентомСервера.GetSecurityProfiles(Кластер) Цикл
		Если НРег(ПрофильБезопасности.Name) = НРег(ИмяПрофиля) Тогда
			Возврат ПрофильБезопасности;
		КонецЕсли;
	КонецЦикла;
	
	ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'В кластере серверов %1:%2 не существует профиль безопасности ""%3""'"),
		Кластер.HostName,
		Формат(Кластер.MainPort, "ЧГ=0"),
		ИмяПрофиля);
	
КонецФункции

Функция ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВиртуальныеКаталоги = Новый Массив();
	
	Для Каждого ВиртуальныйКаталог Из СоединениеСАгентомСервера.GetSecurityProfileVirtualDirectories(Кластер, ИмяПрофиля) Цикл
		
		ВиртуальныеКаталоги.Добавить(ВиртуальныйКаталог);
		
	КонецЦикла;
	
	Возврат ВиртуальныеКаталоги;
	
КонецФункции

Функция ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	COMКлассы = Новый Массив();
	
	Для Каждого COMКласс Из СоединениеСАгентомСервера.GetSecurityProfileCOMClasses(Кластер, ИмяПрофиля) Цикл
		
		COMКлассы.Добавить(COMКласс);
		
	КонецЦикла;
	
	Возврат COMКлассы;
	
КонецФункции

Функция ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВнешниеКомпоненты = Новый Массив();
	
	Для Каждого ВнешняяКомпонента Из СоединениеСАгентомСервера.GetSecurityProfileAddIns(Кластер, ИмяПрофиля) Цикл
		
		ВнешниеКомпоненты.Добавить(ВнешняяКомпонента);
		
	КонецЦикла;
	
	Возврат ВнешниеКомпоненты;
	
КонецФункции

Функция ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ВнешниеМодули = Новый Массив();
	
	Для Каждого ВнешнийМодуль Из СоединениеСАгентомСервера.GetSecurityProfileUnSafeExternalModules(Кластер, ИмяПрофиля) Цикл
		
		ВнешниеМодули.Добавить(ВнешнийМодуль);
		
	КонецЦикла;
	
	Возврат ВнешниеМодули;
	
КонецФункции

Функция ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ПриложенияОС = Новый Массив();
	
	Для Каждого ПриложениеОС Из СоединениеСАгентомСервера.GetSecurityProfileApplications(Кластер, ИмяПрофиля) Цикл
		
		ПриложенияОС.Добавить(ПриложениеОС);
		
	КонецЦикла;
	
	Возврат ПриложенияОС;
	
КонецФункции

Функция ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля)
	
	ИнтернетРесурсы = Новый Массив();
	
	Для Каждого ИнтернетРесурс Из СоединениеСАгентомСервера.GetSecurityProfileInternetResources(Кластер, ИмяПрофиля) Цикл
		
		ИнтернетРесурсы.Добавить(ИнтернетРесурс);
		
	КонецЦикла;
	
	Возврат ИнтернетРесурсы;
	
КонецФункции

Процедура ПрименитьИзмененияСвойствПрофиляБезопасности(СоединениеСАгентомСервера, Кластер, ПрофильБезопасности, СвойстваПрофиляБезопасности)
	
	ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
		ПрофильБезопасности,
		СвойстваПрофиляБезопасности,
		СловарьСвойствПрофиляБезопасности());
	
	ИмяПрофиля = СвойстваПрофиляБезопасности.Имя;
	
	СоединениеСАгентомСервера.RegSecurityProfile(Кластер, ПрофильБезопасности);
	
	// Виртуальный каталоги
	УдаляемыеВиртуальныеКаталоги = ПолучитьВиртуальныеКаталоги(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВиртуальныйКаталог Из УдаляемыеВиртуальныеКаталоги Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileVirtualDirectory(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВиртуальныйКаталог.Alias);
	КонецЦикла;
	СоздаваемыеВиртуальныеКаталоги = СвойстваПрофиляБезопасности.ВиртуальныеКаталоги;
	Для Каждого СоздаваемыйВиртуальныйКаталог Из СоздаваемыеВиртуальныеКаталоги Цикл
		ВиртуальныйКаталог = СоединениеСАгентомСервера.CreateSecurityProfileVirtualDirectory();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВиртуальныйКаталог,
			СоздаваемыйВиртуальныйКаталог,
			СловарьСвойствВиртуальногоКаталога());
		СоединениеСАгентомСервера.RegSecurityProfileVirtualDirectory(Кластер, ИмяПрофиля, ВиртуальныйКаталог);
	КонецЦикла;
	
	// Разрешенные COM-классы
	УдаляемыеCOMКлассы = ПолучитьCOMКлассы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйCOMКласс Из УдаляемыеCOMКлассы Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileCOMClass(
			Кластер,
			ИмяПрофиля,
			УдаляемыйCOMКласс.Name);
	КонецЦикла;
	СоздаваемыеCOMКлассы = СвойстваПрофиляБезопасности.COMКлассы;
	Для Каждого СоздаваемыйCOMКласс Из СоздаваемыеCOMКлассы Цикл
		COMКласс = СоединениеСАгентомСервера.CreateSecurityProfileCOMClass();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			COMКласс,
			СоздаваемыйCOMКласс,
			СловарьСвойствCOMКласса());
		СоединениеСАгентомСервера.RegSecurityProfileCOMClass(Кластер, ИмяПрофиля, COMКласс);
	КонецЦикла;
	
	// Внешние компоненты
	УдаляемыеВнешниеКомпоненты = ПолучитьВнешниеКомпоненты(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВнешнийКомпонент Из УдаляемыеВнешниеКомпоненты Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileAddIn(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВнешнийКомпонент.Name);
	КонецЦикла;
	СоздаваемыеВнешниеКомпоненты = СвойстваПрофиляБезопасности.ВнешниеКомпоненты;
	Для Каждого СоздаваемыйВнешнийКомпонент Из СоздаваемыеВнешниеКомпоненты Цикл
		ВнешнийКомпонент = СоединениеСАгентомСервера.CreateSecurityProfileAddIn();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВнешнийКомпонент,
			СоздаваемыйВнешнийКомпонент,
			СловарьСвойствВнешнейКомпоненты());
		СоединениеСАгентомСервера.RegSecurityProfileAddIn(Кластер, ИмяПрофиля, ВнешнийКомпонент);
	КонецЦикла;
	
	// Внешние модули
	УдаляемыеВнешниеМодули = ПолучитьВнешниеМодули(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйВнешнийМодуль Из УдаляемыеВнешниеМодули Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileUnSafeExternalModule(
			Кластер,
			ИмяПрофиля,
			УдаляемыйВнешнийМодуль.Name);
	КонецЦикла;
	СоздаваемыеВнешниеМодули = СвойстваПрофиляБезопасности.ВнешниеМодули;
	Для Каждого СоздаваемыйВнешнийМодуль Из СоздаваемыеВнешниеМодули Цикл
		ВнешнийМодуль = СоединениеСАгентомСервера.CreateSecurityProfileUnSafeExternalModule();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ВнешнийМодуль,
			СоздаваемыйВнешнийМодуль,
			СловарьСвойствВнешнегоМодуля());
		СоединениеСАгентомСервера.RegSecurityProfileUnSafeExternalModule(Кластер, ИмяПрофиля, ВнешнийМодуль);
	КонецЦикла;
	
	// Приложения ОС
	УдаляемыеПриложенияОС = ПолучитьПриложенияОС(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемоеПриложениеОС Из УдаляемыеПриложенияОС Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileApplication(
			Кластер,
			ИмяПрофиля,
			УдаляемоеПриложениеОС.Name);
	КонецЦикла;
	СоздаваемыеПриложенияОС = СвойстваПрофиляБезопасности.ПриложенияОС;
	Для Каждого СоздаваемоеПриложениеОС Из СоздаваемыеПриложенияОС Цикл
		ПриложениеОС = СоединениеСАгентомСервера.CreateSecurityProfileApplication();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ПриложениеОС,
			СоздаваемоеПриложениеОС,
			СловарьСвойствПриложенияОС());
		СоединениеСАгентомСервера.RegSecurityProfileApplication(Кластер, ИмяПрофиля, ПриложениеОС);
	КонецЦикла;
	
	// Интернет-ресурсы
	УдаляемыеИнтернетРесурсы = ПолучитьИнтернетРесурсы(СоединениеСАгентомСервера, Кластер, ИмяПрофиля);
	Для Каждого УдаляемыйИнтернетРесурс Из УдаляемыеИнтернетРесурсы Цикл
		СоединениеСАгентомСервера.UnregSecurityProfileInternetResource(
			Кластер,
			ИмяПрофиля,
			УдаляемыйИнтернетРесурс.Name);
	КонецЦикла;
	СоздаваемыеИнтернетРесурсы = СвойстваПрофиляБезопасности.ИнтернетРесурсы;
	Для Каждого СоздаваемыйИнтернетРесурс Из СоздаваемыеИнтернетРесурсы Цикл
		ИнтернетРесурс = СоединениеСАгентомСервера.CreateSecurityProfileInternetResource();
		ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(
			ИнтернетРесурс,
			СоздаваемыйИнтернетРесурс,
			СловарьСвойствИнтернетРесурса());
		СоединениеСАгентомСервера.RegSecurityProfileInternetResource(Кластер, ИмяПрофиля, ИнтернетРесурс);
	КонецЦикла;
	
КонецПроцедуры

Функция ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Знач Объект, Знач Словарь)
	
	СвойстваОбъекта = Новый Структура;
	Для Каждого ФрагментСловаря Из Словарь Цикл
		Если ТипЗнч(ФрагментСловаря.Значение) = Тип("Строка") Тогда
			СвойстваОбъекта.Вставить(ФрагментСловаря.Значение);
		ИначеЕсли ТипЗнч(ФрагментСловаря.Значение) = Тип("ФиксированнаяСтруктура") Тогда
			СвойстваОбъекта.Вставить(ФрагментСловаря.Значение.Ключ);
		КонецЕсли;
	КонецЦикла;
	ЗаполнитьЗначенияСвойств(СвойстваОбъекта, Объект);
	
	Описание = Новый Структура();
	Для Каждого ФрагментСловаря Из Словарь Цикл
		Если ТипЗнч(ФрагментСловаря.Значение) = Тип("Строка") Тогда
			Описание.Вставить(ФрагментСловаря.Ключ, СвойстваОбъекта[ФрагментСловаря.Значение]);
		ИначеЕсли ТипЗнч(ФрагментСловаря.Значение) = Тип("ФиксированнаяСтруктура") Тогда
			ПодчиненныйОбъект = СвойстваОбъекта[ФрагментСловаря.Значение.Ключ];
			Если ПодчиненныйОбъект = Неопределено Тогда
				Описание.Вставить(ФрагментСловаря.Ключ, Неопределено);
			Иначе
				Свойство = ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(ПодчиненныйОбъект, ФрагментСловаря.Значение.Словарь);
				Описание.Вставить(ФрагментСловаря.Ключ, Свойство);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Описание;
	
КонецФункции

Функция ОписанияОбъектовОбъектнойМоделиCOMАдминистратора(Знач Объекты, Знач Словарь)
	
	Описания = Новый Массив();
	
	Для Каждого Объект Из Объекты Цикл
		Описания.Добавить(ОписаниеОбъектаОбъектнойМоделиCOMАдминистратора(Объект, Словарь));
	КонецЦикла;
	
	Возврат Описания;
	
КонецФункции

Процедура ЗаполнитьСвойстваОбъектаОбъектнойМоделиCOMАдминистратораПоОписанию(Объект, Знач Описание, Знач Словарь)
	
	СвойстваОбъекта = Новый Структура;
	Для Каждого ФрагментСловаря Из Словарь Цикл
		Если ТипЗнч(ФрагментСловаря.Значение) = Тип("Строка") Тогда
			Если Описание.Свойство(ФрагментСловаря.Ключ) Тогда
				СвойстваОбъекта.Вставить(ФрагментСловаря.Значение, Описание[ФрагментСловаря.Ключ]);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ЗаполнитьЗначенияСвойств(Объект, СвойстваОбъекта);
	
КонецПроцедуры

Функция СловарьСвойствБлокировкиСеансовИРегламентныхЗаданий()
	
	Результат = АдминистрированиеКластера.СвойстваБлокировкиСеансовИРегламентныхЗаданий();
	
	Результат.БлокировкаСеансов = "SessionsDenied";
	Результат.ДатаС = "DeniedFrom";
	Результат.ДатаПо = "DeniedTo";
	Результат.Сообщение = "DeniedMessage";
	Результат.КодРазрешения = "PermissionCode";
	Результат.ПараметрБлокировки = "DeniedParameter";
	Результат.БлокировкаРегламентныхЗаданий = "ScheduledJobsDenied";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствСеансов()
	
	Лицензия = Новый Структура;
	Лицензия.Вставить("Ключ", "License");
	Лицензия.Вставить("Словарь", СловарьСвойствЛицензии());
	
	ОписаниеСоединения = Новый Структура;
	ОписаниеСоединения.Вставить("Ключ", "Connection");
	ОписаниеСоединения.Вставить("Словарь", СловарьСвойствОписанияСоединения());
	
	РабочийПроцесс = Новый Структура;
	РабочийПроцесс.Вставить("Ключ", "Process");
	РабочийПроцесс.Вставить("Словарь", СловарьСвойствРабочегоПроцесса());
	
	Результат = АдминистрированиеКластера.СвойстваСеанса();
	
	Результат.Номер = "SessionID";
	Результат.ИмяПользователя = "UserName";
	Результат.ИмяКлиентскогоКомпьютера = "Host";
	Результат.ИдентификаторКлиентскогоПриложения = "AppID";
	Результат.ИдентификаторЯзыка = "Locale";
	Результат.МоментСозданияСеанса = "StartedAt";
	Результат.МоментПоследнейАктивностиСеанса = "LastActiveAt";
	Результат.БлокировкаСУБД = "blockedByDBMS";
	Результат.Блокировка = "blockedByLS";
	Результат.Передано = "bytesAll";
	Результат.ПереданоЗа5Минут = "bytesLast5Min";
	Результат.СерверныхВызовов = "callsAll";
	Результат.СерверныхВызововЗа5Минут = "callsLast5Min";
	Результат.ДлительностьСерверныхВызовов = "durationAll";
	Результат.ДлительностьТекущегоСерверногоВызова = "durationCurrent";
	Результат.ДлительностьСерверныхВызововЗа5Минут = "durationLast5Min";
	Результат.ПереданоСУБД = "dbmsBytesAll";
	Результат.ПереданоСУБДЗа5Минут = "dbmsBytesLast5Min";
	Результат.ДлительностьВызововСУБД = "durationAllDBMS";
	Результат.ДлительностьТекущегоВызоваСУБД = "durationCurrentDBMS";
	Результат.ДлительностьВызововСУБДЗа5Минут = "durationLast5MinDBMS";
	Результат.СоединениеСУБД = "dbProcInfo";
	Результат.ВремяСоединенияСУБД = "dbProcTook";
	Результат.МоментЗахватаСоединенияСУБД = "dbProcTookAt";
	Результат.Спящий = "Hibernate";
	Результат.ЗавершитьЧерез = "HibernateSessionTerminateTime";
	Результат.ЗаснутьЧерез = "PassiveSessionHibernateTime";
	Результат.ПрочитаноСДиска = "InBytesAll";
	Результат.ПрочитаноСДискаВТекущемВызове = "InBytesCurrent";
	Результат.ПрочитаноСДискаЗа5Минут = "InBytesLast5Min";
	Результат.ЗанятоПамяти = "MemoryAll";
	Результат.ЗанятоПамятиВТекущемВызове = "MemoryCurrent";
	Результат.ЗанятоПамятиЗа5Минут = "MemoryLast5Min";
	Результат.ЗаписаноНаДиск = "OutBytesAll";
	Результат.ЗаписаноНаДискВТекущемВызове = "OutBytesCurrent";
	Результат.ЗаписаноНаДискЗа5Минут = "OutBytesLast5Min";
	Результат.Лицензия = Новый ФиксированнаяСтруктура(Лицензия);
	Результат.ОписаниеСоединения = Новый ФиксированнаяСтруктура(ОписаниеСоединения);
	Результат.РабочийПроцесс = Новый ФиксированнаяСтруктура(РабочийПроцесс);
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствСоединений()
	
	Результат = АдминистрированиеКластера.СвойстваСоединения();
	
	Результат.Номер = "ConnID";
	Результат.ИмяПользователя = "UserName";
	Результат.ИмяКлиентскогоКомпьютера = "HostName";
	Результат.ИдентификаторКлиентскогоПриложения = "AppID";
	Результат.МоментУстановкиСоединения = "ConnectedAt";
	Результат.РежимСоединенияСИнформационнойБазой = "IBConnMode";
	Результат.РежимСоединенияСБазойДанных = "dbConnMode";
	Результат.БлокировкаСУБД = "blockedByDBMS";
	Результат.Передано = "bytesAll";
	Результат.ПереданоЗа5Минут = "bytesLast5Min";
	Результат.СерверныхВызовов = "callsAll";
	Результат.СерверныхВызововЗа5Минут = "callsLast5Min";
	Результат.ПереданоСУБД = "dbmsBytesAll";
	Результат.ПереданоСУБДЗа5Минут = "dbmsBytesLast5Min";
	Результат.СоединениеСУБД = "dbProcInfo";
	Результат.ВремяСУБД = "dbProcTook";
	Результат.МоментЗахватаСоединенияСУБД = "dbProcTookAt";
	Результат.ДлительностьСерверныхВызовов = "durationAll";
	Результат.ДлительностьВызововСУБД = "durationAllDBMS";
	Результат.ДлительностьТекущегоСерверногоВызова = "durationCurrent";
	Результат.ДлительностьТекущегоВызоваСУБД = "durationCurrentDBMS";
	Результат.ДлительностьСерверныхВызововЗа5Минут = "durationLast5Min";
	Результат.ДлительностьВызововСУБДЗа5Минут = "durationLast5MinDBMS";
	Результат.ПрочитаноСДиска = "InBytesAll";
	Результат.ПрочитаноСДискаВТекущемВызове = "InBytesCurrent";
	Результат.ПрочитаноСДискаЗа5Минут = "InBytesLast5Min";
	Результат.ЗанятоПамяти = "MemoryAll";
	Результат.ЗанятоПамятиВТекущемВызове = "MemoryCurrent";
	Результат.ЗанятоПамятиЗа5Минут = "MemoryLast5Min";
	Результат.ЗаписаноНаДиск = "OutBytesAll";
	Результат.ЗаписаноНаДискВТекущемВызове = "OutBytesCurrent";
	Результат.ЗаписаноНаДискЗа5Минут = "OutBytesLast5Min";
	Результат.УправлениеНаходитсяНаСервере = "ThreadMode";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствПрофиляБезопасности()
	
	Результат = АдминистрированиеКластера.СвойстваПрофиляБезопасности();
	
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	Результат.ПрофильБезопасногоРежима = "SafeModeProfile";
	Результат.ПолныйДоступКПривилегированномуРежиму = "PrivilegedModeInSafeModeAllowed";
	Результат.ПолныйДоступКФункциямКриптографии = "CryptographyAllowed";
	
	Результат.ПолныйДоступКРасширениюВсехМодулей = "AllModulesExtension";
	Результат.ДоступныеДляРасширенияМодули = "ModulesAvailableForExtension";
	Результат.НедоступныеДляРасширенияМодули = "ModulesNotAvailableForExtension";
	
	Результат.ПолныйДоступКРасширениюПравДоступа = "RightExtension";
	Результат.РолиОграничивающиеРасширениеПравДоступа = "RightExtensionDefinitionRoles";
	
	Результат.ПолныйДоступКФайловойСистеме = "FileSystemFullAccess";
	Результат.ПолныйДоступКCOMОбъектам = "COMFullAccess";
	Результат.ПолныйДоступКВнешнимКомпонентам = "AddInFullAccess";
	Результат.ПолныйДоступКВнешнимМодулям = "UnSafeExternalModuleFullAccess";
	Результат.ПолныйДоступКПриложениямОперационнойСистемы = "ExternalAppFullAccess";
	Результат.ПолныйДоступКИнтернетРесурсам = "InternetFullAccess";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВиртуальногоКаталога()
	
	Результат = АдминистрированиеКластера.СвойстваВиртуальногоКаталога();
	
	Результат.ЛогическийURL = "Alias";
	Результат.ФизическийURL = "PhysicalPath";
	
	Результат.Описание = "Descr";
	
	Результат.ЧтениеДанных = "AllowedRead";
	Результат.ЗаписьДанных = "AllowedWrite";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствCOMКласса()
	
	Результат = АдминистрированиеКластера.СвойстваCOMКласса();
	
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	
	Результат.ФайлМоникер = "FileName";
	Результат.CLSID = "ObjectUUID";
	Результат.Компьютер = "ComputerName";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВнешнейКомпоненты()
	
	Результат = АдминистрированиеКластера.СвойстваВнешнейКомпоненты();
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	Результат.ХешСумма = "AddInHash";
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствВнешнегоМодуля()
	
	Результат = АдминистрированиеКластера.СвойстваВнешнегоМодуля();
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	Результат.ХешСумма = "ExternalModuleHash";
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствПриложенияОС()
	
	Результат = АдминистрированиеКластера.СвойстваПриложенияОС();
	
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	
	Результат.ШаблонСтрокиЗапуска = "CommandMask";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствИнтернетРесурса()
	
	Результат = АдминистрированиеКластера.СвойстваИнтернетРесурса();
	
	Результат.Имя = "Name";
	Результат.Описание = "Descr";
	
	Результат.Протокол = "Protocol";
	Результат.Адрес = "Address";
	Результат.Порт = "Port";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствОписанияСоединения()
	
	РабочийПроцесс = Новый Структура;
	РабочийПроцесс.Вставить("Ключ", "Process");
	РабочийПроцесс.Вставить("Словарь", СловарьСвойствРабочегоПроцесса());
	
	Результат = АдминистрированиеКластера.СвойстваОписанияСоединения();
	
	Результат.ИмяПриложения = "Application";
	Результат.Блокировка = "blockedByLS";
	Результат.МоментУстановкиСоединения = "ConnectedAt";
	Результат.Номер = "ConnID";
	Результат.ИмяКлиентскогоКомпьютера = "Host";
	Результат.НомерСеанса = "SessionID";
	Результат.РабочийПроцесс = Новый ФиксированнаяСтруктура(РабочийПроцесс);
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствЛицензии()
	
	Результат = АдминистрированиеКластера.СвойстваЛицензии();
	
	Результат.ИмяФайла = "FileName";
	Результат.ПолноеПредставление = "FullPresentation";
	Результат.КраткоеПредставление = "ShortPresentation";
	Результат.ВыданаСервером = "IssuedByServer";
	Результат.ТипЛицензии = "LicenseType";
	Результат.МаксимальноеКоличествоПользователейДляКомплекта = "MaxUsersAll";
	Результат.МаксимальноеКоличествоПользователейВКлюче = "MaxUsersCur";
	Результат.ЛицензияПолученаЧерезAladdinLicenseManager = "Net";
	Результат.АдресПроцесса = "RMngrAddress";
	Результат.ИдентификаторПроцесса = "RMngrPID";
	Результат.ПортПроцесса = "RMngrPort";
	Результат.СерияКлюча = "Series";
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

Функция СловарьСвойствРабочегоПроцесса()
	
	Лицензия = Новый Структура;
	Лицензия.Вставить("Ключ", "License");
	Лицензия.Вставить("Словарь", СловарьСвойствЛицензии());
	
	Результат = АдминистрированиеКластера.СвойстваРабочегоПроцесса();
	
	Результат.ДоступнаяПроизводительность = "AvailablePerfomance";
	Результат.ЗатраченоКлиентом = "AvgBackCallTime";
	Результат.РеакцияСервера = "AvgCallTime";
	Результат.ЗатраченоСУБД = "AvgDBCallTime";
	Результат.ЗатраченоМенеджеромБлокировок = "AvgLockCallTime";
	Результат.ЗатраченоСервером = "AvgServerCallTime";
	Результат.КлиентскихПотоков = "AvgThreads";
	Результат.ОтносительнаяПроизводительность = "Capacity";
	Результат.Соединений = "Connections";
	Результат.ИмяКомпьютера = "HostName";
	Результат.Включен = "IsEnable";
	Результат.Порт = "MainPort";
	Результат.ПревышениеНадКритическимЗначением = "MemoryExcessTime";
	Результат.ЗанятоПамяти = "MemorySize";
	Результат.Идентификатор = "PID";
	Результат.Запущен = "Running";
	Результат.КоличествоВызововПоКоторымПосчитанаСтатистика = "SelectionSize";
	Результат.МоментЗапуска = "StartedAt";
	Результат.Использование = "Use";
	Результат.Лицензия = Новый ФиксированнаяСтруктура(Лицензия);
	
	Возврат Новый ФиксированнаяСтруктура(Результат);
	
КонецФункции

#КонецОбласти